package com.echo.util;

import org.mindrot.jbcrypt.BCrypt;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * BCrypt密码加密工具类
 * 专门处理BCrypt版本兼容性问题
 */
public class BCryptUtil {

    private static final Logger logger = Logger.getLogger(BCryptUtil.class.getName());
    
    /**
     * 加密密码
     * @param password 原始密码
     * @return 加密后的密码
     */
    public static String encrypt(String password) {
        if (password == null || password.isEmpty()) {
            throw new IllegalArgumentException("密码不能为空");
        }
        
        try {
            // 使用当前版本的BCrypt加密
            return BCrypt.hashpw(password, BCrypt.gensalt());
        } catch (Exception e) {
            logger.log(Level.SEVERE, "密码加密失败", e);
            throw new RuntimeException("密码加密失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 验证密码
     * 包含版本兼容性处理
     * @param plainPassword 明文密码
     * @param hashedPassword 加密后的密码
     * @return 密码是否匹配
     */
    public static boolean checkPassword(String plainPassword, String hashedPassword) {
        if (plainPassword == null || plainPassword.isEmpty() || 
            hashedPassword == null || hashedPassword.isEmpty()) {
            return false;
        }
        
        try {
            // 尝试使用标准方法验证
            return BCrypt.checkpw(plainPassword, hashedPassword);
        } catch (IllegalArgumentException e) {
            // 捕获版本不兼容异常
            logger.log(Level.WARNING, "BCrypt版本不兼容异常: " + e.getMessage());
            
            // 检查是否是因为盐值版本问题
            if (e.getMessage() != null && e.getMessage().contains("Invalid salt version")) {
                logger.warning("检测到无效的盐值版本，请使用正确版本的BCrypt库或重置密码");
            }
            
            return false;
        } catch (Exception e) {
            logger.log(Level.SEVERE, "密码验证过程中发生异常", e);
            return false;
        }
    }
    
    /**
     * 检查密码哈希值是否有效（格式和版本）
     * @param hashedPassword 加密后的密码
     * @return 哈希值是否有效
     */
    public static boolean isValidHash(String hashedPassword) {
        if (hashedPassword == null || hashedPassword.isEmpty()) {
            return false;
        }
        
        try {
            // 检查哈希值格式和版本
            // BCrypt哈希值通常以$2a$、$2b$、$2y$等开头
            return hashedPassword.matches("^\\$2[aby]\\$\\d{2}\\$[./A-Za-z0-9]{53}$");
        } catch (Exception e) {
            logger.log(Level.WARNING, "检查哈希值有效性失败", e);
            return false;
        }
    }
}